package com.dy.树.将有序数组转换为二叉搜索树;

import com.dy.树.TreeNode;

import java.util.Arrays;

/*
将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组，转换为一棵高度平衡二叉搜索树。

本题中，一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是：[0,-3,9,-10,null,5]，它可以表示下面这个高度平衡二叉搜索树：

      0
     / \
   -3   9
   /   /
 -10  5
 */
/*
解题思路：

1，平衡二叉树：空树或者它的左右两个子树的高度差的绝对值不超过1，并且左右两个子树也都是平衡树。

2，二叉搜索树：空树或者二叉树的所有节点比他的左子节点大，比他的右子节点小。

知道上述概念后，由于我们输入的是有序数组，只需要从中间对分，中间数作为根节点，左侧数组为左子树，右侧数组为右子树，
此时左右子树结点数目最多相差1个，再依次递归左右子树。满足条件的高度平衡二叉搜索树就出现了。

 */
public class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return sortedArrayToBST(nums,0,nums.length-1);

    }
    public TreeNode sortedArrayToBST(int [] nums,int left,int right){
        if(left>right)return null;                                        //边界条件，注意是left>right
        int mid=(left+right)/2;
        TreeNode root=new TreeNode(nums[mid]);
        root.left=sortedArrayToBST(nums,left,mid-1);        //递归向左探索，范围变成left~mid-1;
        root.right=sortedArrayToBST(nums,mid+1,right);
        return root;
    }
}
